package com.heima.it.allTest;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/*** 自己尝试完成登录、注册、忘记密码的业务逻辑 ***/
public class stuSysSong {
    public static void main(String[] args) {
        ArrayList<user> useArr = new ArrayList<>();   // 存放已注册的用户
        int opo = 3;
        while (opo > 0) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作：1（登录），2（注册），3（忘记密码）");
            Scanner scc = new Scanner(System.in);
            String choose = scc.next();
            switch (choose) {
                case "1":
                    if (!login(useArr)) {
                        opo--;
                        System.out.println("剩余" + opo + "次机会");
                    }
                    ;
                    break;
                case "2":
                    zhuce(useArr);
                    break;
                case "3":
                    forgetPSW(useArr);
                    break;
                default:
                    System.out.println("操作序号有误，请重新输入！");
                    break;
            }
        }
    }

    //    注册
    public static void zhuce(ArrayList<user> list) {
        user user = new user();
        Scanner ssc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入用户名：");
            String uname = ssc.next();
            for (int i = 0; i < list.size(); i++) {    // 验证用户名唯一性
                String userName = list.get(i).getUserName();
                if (uname.equals(userName)) {
                    System.out.println("用户名已存在，请直接登录！！");
                    return;
                }
            }
            if (!checkName(uname)) {  // 交给校验方法，去校验用户名是否合规
                System.out.println("用户名不符合规范（字母+数字），请重新输入！");
            } else {
                user.setUserName(uname);
                System.out.println("请输入密码：");
                String psw1 = ssc.next();
                System.out.println("请再次输入密码：");
                String psw2 = ssc.next();
                if (!psw2.equals(psw1)) {
                    System.out.println("两次密码不一致，请重新输入！");
                } else {
                    user.setPassWord(psw2);
                    System.out.println("请输入身份证号-342401199601094295：");
                    String uids = ssc.next();
                    if (!checkIds(uids)) {
                        System.out.println("身份证号不符合规则，请重新输入！");
                    } else {
                        user.setIdCar(uids);
                        System.out.println("请输入手机号-18756985632：");
                        String uphone = ssc.next();
                        if (!checkPhone(uphone)) {
                            System.out.println("手机号不符合规则，请重新输入！");
                        } else {
                            user.setPhone(uphone);
                            list.add(user);
                            System.out.println("注册成功！！");
                            System.out.println("用户信息为：" + list.get(0).getUserName() + list.get(0).getPassWord());
                            System.out.println("---------------------------------------------------------------------------");
                            break;
                        }
                    }
                }
            }
        }
    }

    //    登录 （输入账号【已注册、未注册提示去注册】、密码【注册时填写的一致】、验证码【填写的要与随机生成的一致（数字+字母+6位）】）
    public static boolean login(ArrayList<user> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名：");
        String username = sc.next();
        if (list.size() <= 0) {   // 集合里面用户一个都没有
            System.out.println("用户名不存在，请先注册！！");
            return true;
        }
        for (int i = 0; i < list.size(); i++) {    // 此时有用户，进一步验证，输入的用户名是否存在与集合里面。
            String userName = list.get(i).getUserName();
            if (!username.equals(userName)) {
                System.out.println("用户名不存在，请先注册！！");
                return true;
            }
        }
        System.out.println("请输入密码：");
        String userpsw = sc.next();
        int usx = returnUserIndex(list, username);  // 根据用户名，得到用户对象索引
        user oneUser = list.get(usx);           // 根据索引， 得到用户对象
        if (!oneUser.getPassWord().equals(userpsw)) {
            System.out.println("密码错误！重新操作！");
            return false;
        }
        String codess = getCodes();
        System.out.println("请输入验证码：(" + codess + ")");
        String usercode = sc.next();
        if (!codess.equals(usercode)) {
            System.out.println("验证码出入有误，请重新操作！！");
            return true;
        }
        System.out.println("恭喜！登录成功！");
        creatStudentSystem();   // 进入学生管理系统
        return true;
    }

    //    忘记密码
    public static void forgetPSW(ArrayList<user> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名：");
        String username = sc.next();
        if (list.size() <= 0) {   // 集合里面用户一个都没有
            System.out.println("用户名不存在，请先注册！！");
            return;
        }
        for (int i = 0; i < list.size(); i++) {    // 此时有用户，进一步验证，输入的用户名是否存在与集合里面。
            String userName = list.get(i).getUserName();
            if (!username.equals(userName)) {
                System.out.println("用户名不存在，请先注册！！");
                return;
            }
        }
        System.out.println("请输入身份证号-342401199601094295：");
        String uids = sc.next();
        for (int i = 0; i < list.size(); i++) {    // 此时有用户，进一步验证，输入的身份证号是否存在与集合里面。
            String idcar = list.get(i).getIdCar();
            if (!idcar.equals(uids)) {
                System.out.println("身份证信息不一致，请重新操作！！");
                return;
            }
        }
        System.out.println("请输入手机号-18756985632：");
        String uphone = sc.next();
        for (int i = 0; i < list.size(); i++) {    // 此时有用户，进一步验证，输入的手机号是否存在与集合里面。
            String phone = list.get(i).getPhone();
            if (!phone.equals(uphone)) {
                System.out.println("手机号不一致，请重新操作！！");
                return;
            }
        }
        System.out.println("请输入新密码：");
        String newpsw = sc.next();
//        对集合中的密码进行修改
        int ct = 0;
        for (int i = 0; i < list.size(); i++) {    // 此时有用户，进一步验证，输入的手机号是否存在与集合里面。
            String phone = list.get(i).getPhone();
            if (phone.equals(uphone)) {
                ct = i;
            }
        }
        list.get(ct).setPassWord(newpsw);
        System.out.println("修改密码成功！");
        System.out.println("被修改的人：" + list.get(ct).getUserName() + "\t修改后的密码：" + list.get(ct).getPassWord() + "");
        return;
    }

    //    校验用户名（数字+字母）
    public static boolean checkName(String name) {
        int length = name.length();
        if (length < 3 && length > 15) {
            return false;
        }
        int ctSmall = 0;
        int ctBig = 0;
        for (int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);
            if (c >= 'a' && c <= 'z') {
                ctSmall++;
            } else if (c >= 'A' && c <= 'Z') {
                ctBig++;
            } else if (c < '0' || c > '9') {
                return false;
            }
        }
        if (ctSmall == 0 && ctBig == 0) {
            return false;
        } else {
            return true;
        }
    }

    //    校验身份证号（ 必须18位、不能0开头、前17位必须数字最后一位可以是数字也可以是X或是x ）  342401199601094295
    public static boolean checkIds(String ids) {
        char c0 = ids.charAt(0);
        if (c0 == '0') {   // 开头数字不能为0，为0就返回错误
            return false;
        }
        if (ids.length() > 18 && ids.length() <= 17) {  // 必须是18位
            return false;
        }
        String sub = ids.substring(0, ids.length() - 1); // 截取前17为数字
        for (int i = 0; i < sub.length(); i++) {
            if (sub.charAt(i) < '0' || sub.charAt(i) > '9') {
                return false;
            }
        }
        String sublast = ids.substring(ids.length() - 1);
        if (sublast.charAt(0) < '0' || sublast.charAt(0) > '9') {
            if (sublast.charAt(0) != 'x' && sublast.charAt(0) != 'X') {
                return false;
            }
        }
        return true;
    }

    //    校验手机号（长度11位、不能以0开头、必须都是为数字）
    public static boolean checkPhone(String phone) {
        if (phone.length() != 11) {
            return false;
        }
        char pfirst = phone.charAt(0);
        if (pfirst == '0') {
            return false;
        }
        for (int i = 0; i < phone.length(); i++) {
            if (phone.charAt(i) < '0' || phone.charAt(i) > '9') {
                return false;
            }
        }
        return true;
    }

    //    根据用户名 在集合中查出用户对象并返回索引号
    public static int returnUserIndex(ArrayList<user> list, String name) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getUserName().equals(name)) {
                return i;
            }
        }
        return -1;
    }

    //    随机生成6位的验证码（数字+字母）
    public static String getCodes() {
//        查表法
        String[] sjcodes = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            int nbs = random.nextInt(61);
            sb.append(sjcodes[nbs]);
        }
        return sb.toString();
    }

    //  创建学生管理系统
    public static void creatStudentSystem() {
        //        用一个集合来存储学生对象
        ArrayList<students> stuArr = new ArrayList<>();
//        键盘录入对应的序号，执行对应的逻辑操作
        Scanner sc = new Scanner(System.in);
        while (true) {
            //        展示序号对应的功能列表
            System.out.println("-----------------------请录入要操纵的序号，学生管理系统------------------------------");
            System.out.println("1-增加学生信息");
            System.out.println("2-删除学生信息");
            System.out.println("3-修改学生信息");
            System.out.println("4-查询学生信息");
            System.out.println("5-退出");
            System.out.println("-----------------------请录入要操纵的序号，学生管理系统------------------------------");
            String num = sc.next();
            switch (num) {
                case "1":
                    add(stuArr);
                    break;
                case "2":
                    delete(stuArr);
                    break;
                case "3":
                    change(stuArr);
                    break;
                case "4":
                    query(stuArr);
                    break;
                case "5":
                    System.out.println("退出成功！");
                    System.exit(0);  // 退出所有循环
                default:
                    System.out.println("录入的序号有误！请重新录入！！！");
                    break;
            }
        }
    }

    //    增加
    public static void add(ArrayList<students> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入学生id号:");
        String ids = sc.next();
        int indexNum = returnStudents(list, ids); // 根据 id 值校验是否已经存在当前学生
        if (indexNum != -1) {
            System.out.println("已经存在该学生！请重新添加！！！");
            return;
        }
        System.out.println("输入学生姓名：");
        String name = sc.next();
        System.out.println("输入学生年龄：");
        String age = sc.next();
        System.out.println("输入学生地址：");
        String addres = sc.next();
        students stud = new students();
        stud.setId(ids);
        stud.setNames(name);
        stud.setAge(age);
        stud.setAddres(addres);
        list.add(stud);
        System.out.println("添加学生信息成功！！");
        showAllStudents(list);
    }

    //    删除
    public static void delete(ArrayList<students> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入学生id号:");
        String ids = sc.next();
        int indexNum = returnStudents(list, ids); // 根据 id 值校验是否已经存在当前学生
        if (indexNum == -1) {
            System.out.println("不存在该学生！请重新输入！！！");
            return;
        }
        list.remove(indexNum);
        showAllStudents(list);
    }

    //    修改
    public static void change(ArrayList<students> list) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入要修改的学生id号:");
        String ids = sc.next();
        int indexNum = returnStudents(list, ids); // 根据 id 值校验是否已经存在当前学生
        if (indexNum == -1) {
            System.out.println("不存在该学生！请重新输入！！！");
            return;
        }
        students stud = list.get(indexNum);
        System.out.println("输入学生姓名：");
        String name = sc.next();
        System.out.println("输入学生年龄：");
        String age = sc.next();
        System.out.println("输入学生地址：");
        String addres = sc.next();
        stud.setId(ids);
        stud.setNames(name);
        stud.setAge(age);
        stud.setAddres(addres);
        System.out.println("修改学生信息成功！！");
        showAllStudents(list);
    }

    //    查询
    public static void query(ArrayList<students> list) {
        // 键盘录入对应的id号码，执行对应的逻辑操作
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入查询的学生id号码：");
        String idNum;
        idNum = sc.next();
        int indexNum = returnStudents(list, idNum);
        if (indexNum == -1) {
            System.out.println("未查询到对应id的学生，请重新输入id值！！！！");
        } else {
            System.out.println("姓名：" + list.get(indexNum).getNames() + "\t年龄：" + list.get(indexNum).getAge() + "\t住址：" + list.get(indexNum).getAddres());
        }
    }

    //    根据id 在集合中查出学生对象并返回索引号
    public static int returnStudents(ArrayList<students> list, String id) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getId().equals(id)) {
                return i;
            }
        }
        return -1;
    }

    //    展示集合中所有的学生对象
    public static void showAllStudents(ArrayList<students> list) {
        System.out.println("此时还剩" + list.size() + "个学生");
        System.out.println("姓名\t\t" + "年龄\t" + "住址\t" + "学号");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getNames() + "\t\t" + list.get(i).getAge() + "\t\t" + list.get(i).getAddres() + "\t\t" + list.get(i).getId());
        }
    }


}
